<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
</body>
<script>    
    // 这个模式在Javascript中被称为模块
    // CoolModule()返回一个用对象字面量语法{key:value,...}来表示的对象
    // 这个返回的对象中含有对内部函数而不是内部数据变量的引用。
    // 我们保持内部数据变量是隐藏且私有的状态 可以将这个对象类型的返回值看作本质上是模块的公共API
    function CoolModule(){
        var something = "cool";
        var  another = [1,2,3];
        function doSomething(){
            console.log(something);
        }
        function doAnother(){
            console.log(another.join("!"))
        }
        return {
            doSomething:doSomething,
            doAnother:doAnother
        }
    }
    var foo = CoolModule();
    foo.doSometing();
    foo.doAnother();


    //改进
//  通过在模块实例的内部保留对公共API对象的内部引用 可以从内部对模块实例进行修改，包括添加或修该它们的值
    (function Cool_Module(id){
       function change(){
           publicAPI.identify = identify2;
       }

       function identify1(){
           console.log(id)
       }
       function identify2(){
           console.log(id.toUpperCase())
       }
       var publicAPI = {
           change:change,
           identify:identify1
       }
       return publicAPI;
    })("foo module")
      
      foo.identify();//foo module
      foo.change();
      foo.identify();//FOO MODULE
</script>
</html>